//	---------------------------------------------------------------------------
//
//	@file		TwGraph.h
//	@brief		ITwGraph pure interface
//	@author		Philippe Decaudin
//	@license	This file is part of the AntTweakBar library.
//				For conditions of distribution and use, see License.txt
//
//	---------------------------------------------------------------------------


#if !defined ANT_TW_GRAPH_INCLUDED
#define ANT_TW_GRAPH_INCLUDED

#include "TwColors.h"
#include "TwFonts.h"

#include <string>

#ifdef DrawText		// DirectX redefines 'DrawText' !!
#	undef DrawText
#endif	// DrawText

struct IUnknown;

namespace AntTweakBar {

//	---------------------------------------------------------------------------

class ITwGraph
{
public:
	// Create instance, if a D3D device is given, autodetect its version,
	// otherwise use OpenGL (core profile is preferred)
	static ITwGraph*	Create(IUnknown* _D3DDevice = 0l);

	static ITwGraph*	CreateForAPI(int, void* = 0l); //  TwInit signature

	static bool			Delete(ITwGraph*);
	static const char*	GetErrorState();


	virtual void		BeginDraw(int _WndWidth, int _WndHeight) = 0;
	virtual void		EndDraw() = 0;
	virtual bool		IsDrawing() = 0;
	virtual void		Restore() = 0;

	virtual void		DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false) = 0;
	virtual void		DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) = 0;
	virtual void		DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) = 0;
	virtual void		DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) = 0;
	enum Cull			{ CULL_NONE, CULL_CW, CULL_CCW };
	virtual void		DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) = 0;

	virtual void *		NewTextObj() = 0;
	virtual void		DeleteTextObj(void *_TextObj) = 0;
	virtual void		BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) = 0;
	virtual void		DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) = 0;

	virtual void		ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) = 0;
	virtual void		RestoreViewport() = 0;
	virtual void		SetScissor(int _X0, int _Y0, int _Width, int _Height) = 0;

protected:

	ITwGraph() { }
	virtual				~ITwGraph();

	virtual int			Init() = 0;
	virtual int			Shut() = 0;

	static char const*	g_ErrorState;
};

//	---------------------------------------------------------------------------
}
#endif	// ANT_TW_GRAPH_INCLUDED
